package unq.edu.cui.tp.dominio;

import java.util.ArrayList;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import org.uqbar.commons.model.ObservableUtils;
import org.uqbar.commons.model.UserException;
import org.uqbar.commons.utils.Observable;

@Observable
public class Disponibilidad {
	private List<Dia> diasDisponibles;// Dias en los que esta disponible para trabajar (dias con horario)
	private Set<Date> restricciones;//Fechas en los que no puede trabajar 
			
	/**
	 * Verifica si un dia es apto para agregar, osea que no tenia ninguna asignacion previa de ese dia y el horario cumple las condiciones.
	 * @param dia
	 * @return
	 */
	public boolean sePuedeAgregar(Dia dia) {	
		return ! this.nombresDeDias(this.getDiasDisponibles()).contains(dia.getNombreDia()) && dia.cumpleCondicionesDeHorario();	 
	}
	
	/**
	 * Eliminar un dia
	 * @param dia
	 */
	public void eliminarDiaDisponible(Dia dia) {
		this.getDiasDisponibles().remove(dia);
		ObservableUtils.firePropertyChanged(this, "diasDisponibles", this.getDiasDisponibles());
	
	}
	
	/**
	 * Dada una lista de dias retorna los nombres.
	 * @param dias
	 * @return
	 */
	private List<String> nombresDeDias(List<Dia> dias) {
		List<String> ret = new ArrayList<String>();
		for(Dia d : dias){
			ret.add(d.getNombreDia().toLowerCase());
		}
		return ret;
	}

	/**
	 * Agrega un dia disponible (dia con horario).
	 * @param dia
	 */
	public void agregarDiaDisponible(Dia dia) {
		if(sePuedeAgregar(dia)){
			this.getDiasDisponibles().add(dia);
			ObservableUtils.firePropertyChanged(this, "diasDisponibles", this.getDiasDisponibles());
		}
		else{
			throw new UserException("No se puede agregar el dia");
		}
	}
	/*
	 * Dias que todavia no tienen asignado un horario.
	 * @return
	 */
	public List<String> diasParaMostrar() {
		List<String> retDias = new ArrayList<String>();
		
		for(Dia d : this.getDias()){
			if(this.sePuedeAgregar(d)){
				retDias.add(d.getNombreDia());
			}
		}
		return retDias;
	}
	public List<Dia> getDias(){
		List<Dia> dias = new ArrayList<Dia>();		
		Dia lunes = new Dia("lunes", 8, 16);
		Dia martes = new Dia("martes", 8, 16);
		Dia miercoles = new Dia("miercoles", 8, 16);
		Dia jueves = new Dia("jueves", 8, 16);
		Dia viernes = new Dia("viernes", 8, 16);
		Dia sabado = new Dia("sabado", 8, 16);
		Dia domingo = new Dia("domingo", 8, 16);
		
		dias.add(lunes);
		dias.add(martes);
		dias.add(miercoles);
		dias.add(jueves);
		dias.add(viernes);
		dias.add(sabado);
		dias.add(domingo);
		
		return dias;
	}
	/**
	 * Elimina una restriccion
	 * @param fecha
	 */
	public void eliminarRestriccion(Date fecha) {
		 this.getRestricciones().remove(fecha);
		}
	/**
	 * Agrega una restriccion
	 * @param fecha
	 */
	public void agregarRestriccion(Date fecha) {
		this.getRestricciones().add(fecha);
		ObservableUtils.firePropertyChanged(this, "restricciones", this.getRestricciones());

		
	}
	// ********************************************************
	// ** Accessors
	// ********************************************************
	public List<Dia> getDiasDisponibles() {
		return diasDisponibles;
	}
	public void setDiasDisponibles(List<Dia> diasDisponibles) {
		this.diasDisponibles = diasDisponibles;
	}
	public Set<Date> getRestricciones() {
		return restricciones;
	}
	public void setRestricciones(Set<Date> restricciones) {
		this.restricciones = restricciones;
	}	
	//////////////////////////////////
	//Constructores
	//////////////////////////////////
	public Disponibilidad(List<Dia> diasDisponibles, Set<Date> restricciones) {
		super();
		this.diasDisponibles = diasDisponibles;
		this.restricciones = restricciones;
	}
	
	public Disponibilidad(){
		this.diasDisponibles = new ArrayList<Dia>();
		this.restricciones = new HashSet<Date>();
	}

	public Disponibilidad(List<Dia> diasDisponibles) {
		this.diasDisponibles = diasDisponibles;
	}
}